Software development projects are increasingly including a “portability” requirement mandating that the software application function without modification in a variety of different platform environments (e.g. are “platform neutral” or “platform independent”). Some programming languages such as Java and C# were designed to foster platform-independence and thus are “platform neutral.” Java uses an interface known as the “Java virtual machine” between the software application and the underlying technical architecture and operating environment (collectively “platform”) in order to render the platform transparent to the software application. Platform neutral application code components (referred to as “bytecode” in Java applications) leave all platform-dependent processing, information, and cognizance for the virtual machine. A “platform-independent” software application can be distributed across multiple platforms without modification of the software application.
“Platform independent” software applications need not be limited to Java, C#, or some other programming language that is specifically designated to be “platform neutral.” While other types and categories of programming languages may not have been specifically designed to create “platform neutral” software applications, a wide variety of different programming languages can utilize the Java virtual machine, a different non-Java virtual machine, or some other extra interface layer (collectively “virtual machine interface”) in order to support “platform-independence” in those particular programming languages. The use of a virtual machine interface can transform many different computer programming languages into “platform-independent” programming languages.
Regardless of the specific characteristics of the virtual machine interface, the flexibility of platform-independent software applications raises challenges with respect to the ability to profile the runtime environments of those software applications. A virtual machine interface typically incorporates computer code written in a variety of different languages, which means that the software application using the virtual machine architecture typically interacts with and utilizes at least one or more computer code components that are written in programming languages different from the programming language of the software application. In a virtual machine or platform-independent application architecture, the execution of a software application requires the use of an extra-layer of computer code residing in the virtual machine interface. It is this extra layer of computer code, with the extra set of code component interactions, that makes profiling difficult.
The profiling of runtime environments is a prudent and often necessary step in the software development process as well as with regards to the management of existing information systems. For example, software applications that function adequately with only a few users and merely hundreds of rows of data in a testing environment may not function adequately when thousands of users are invoking the application to interact with millions of rows of data on a database. The profiling of the runtime environment of a software application is useful in determining whether that particular software application is scalable to the point where the application can adequately perform in a production environment. Profiling may be particularly important in situations involving “platform neutral” software and architectures because the existence of an additional interface layer such as a virtual machine, results in more interactions between various components of the system because such systems typically utilize a more compartmentalized infrastructure.
Prior art profiling tools and techniques for platform-independent runtime environments are inadequate. The existing art does not provide a way to profile both the software application and the non-application code components used by the software application in an unobtrusive and dynamic manner. The attributes of an interface such as a virtual machine that provides for platform transparency also interfere with the existing techniques and tools for comprehensive profiling of the runtime environment. Some existing art has attempted to use embedded agents and other forms of intrusive specialized application processing to enhance profiling capabilities, but such intrusive measures alter the runtime environment being profiled, often negating much of the information derived from the embedded profiling agent. It would be desirable to be able to comprehensively profile a runtime environment in a non-intrusive manner.